// 循环队列

#include <stdio.h>
#include <malloc.h>

#define OK 1
#define ERROR 0

typedef int Status;

#define MAXQSIZE 10

typedef int Status;
typedef int QElemType; //定义队列中元素类型

typedef struct {
    QElemType *base;
    int front;
    int rear;
} SqQueue;  //定义循环队列类型

Status InitQueue(SqQueue &Q) {
    Q.base = (QElemType *) malloc(sizeof(QElemType) * MAXQSIZE);
    if (!Q.base)
        return ERROR;
    Q.front = Q.rear = 0;
    return OK;
} //分配数组空间，初始化为空队列

Status GetHead(SqQueue Q, QElemType &e) {
    if (Q.rear == Q.front)
        return ERROR;
    e = Q.base[Q.front];
    return OK;
}//获取队头元素的值并返回在e中。取值成功返回OK，否则返回ERROR。

Status EnQueue(SqQueue &Q, QElemType e) {
    if ((Q.rear + 1) % MAXQSIZE == Q.front)
        return ERROR;
    Q.base[Q.rear] = e;
    Q.rear = (Q.rear + 1) % MAXQSIZE;
    return OK;
}//在队列Q中将元素e入队为新的队尾元素。入队成功返回OK，针对数组空间已满直接返回ERROR。

Status DeQueue(SqQueue &Q, QElemType &e) {
    if (Q.rear == Q.front)
        return ERROR;
    e = Q.base[Q.front];
    Q.front = (Q.front + 1) % MAXQSIZE;
    return OK;
}//将队头元素出队，其值返回e中。出队失败返回ERROR，成功返回OK。

int QueueLength(SqQueue Q) {
    return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}//求长度操作，返回队列中元素的个数。
